// 条款48：认识模板元编程
// 核心概念
// 模板元编程（Template Metaprogramming，简称TMP）是一种在C++编译期执行的编程范式。
// 它利用模板实例化机制在编译时进行计算，而不是在运行时。

// 模板元编程的本质
// 模板元编程本质上是一种函数式编程：
//      使用模板递归而非循环
//      使用模板特化作为条件判断
//      在编译期完成计算，生成优化的代码

// 模板元编程的优势
// 1.性能提升：将计算从运行时转移到编译时，减少运行时开销
// 2.保证编译期正确性：某些错误可以在编译期被捕获
// 3.实现某些运行时无法实现的功能：如维度单位检查、表达式模板等
// 4.生成高度优化的代码：编译器可以针对特定情况生成最优代码

// 经典例子：编译期阶乘计算
// 非类型模板参数
template <unsigned n>
struct Factorial
{
    enum
    {
        value = n * Factorial<n - 1>::value
    };
}

// 特化：基本情况（递归终止条件）
template <>
struct Factorial<0>
{
    enum
    {
        value = 1
    };
};

// 使用
int main()
{
    int x = Factorial<5>::value; // 编译期计算，x = 120
    return 0;
}
// 在这个例子中：
// 计算完全在编译期进行
// 生成的代码等同于 int x = 120;
// 没有运行时计算开销

